package com.netease;

import java.time.Duration;
import java.time.Instant;

/**
 * @projectName: modeling-dev
 * @package: com.netease
 * @className: TransferRateCalculator
 * @author: aochong
 * @description: TODO
 * @date: 2023/7/4 19:28
 * @version: 1.0
 */
public class SendData {
    private static final int totalDataSize = 100; // 总数据量
    private static final int totalTimeSeconds = 300; // 总发送时间（单位：秒）

    public static void main(String[] args) {
        int dataPerInterval = totalDataSize / (totalTimeSeconds / 5); // 每个5分钟时间间隔的数据量
        int secondsPerInterval = 5 * 60; // 每个5分钟时间间隔的秒数
        Instant startTime = Instant.now(); // 记录开始时间
        int sentDataSize = 0; // 已发送数据量
        int elapsedTimeSeconds;
        // 模拟发送数据过程
        while (true) {
            try {
                Thread.sleep(6000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            Instant currentTime = Instant.now();
            elapsedTimeSeconds = (int) Duration.between(startTime, currentTime).getSeconds();
            if (elapsedTimeSeconds >= totalTimeSeconds) {
                break; // 超过总发送时间，退出循环
            }
            // 模拟发送数据
            int dataToSend = calculateDataToSend(elapsedTimeSeconds, dataPerInterval, secondsPerInterval);
            send(dataToSend);
            sentDataSize += dataToSend;
            // 控制发送频率，每秒发送一次
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        Instant endTime = Instant.now(); // 记录结束时间
        int totalTimeSentSeconds = elapsedTimeSeconds;
        double averageDataPerSecond = (double) sentDataSize / totalTimeSentSeconds;
        System.out.println("总发送时间（秒）: " + totalTimeSentSeconds);
        System.out.println("每秒发送的平均数据量: " + averageDataPerSecond);
    }
    // 计算当前时间间隔内应发送的数据量
    private static int calculateDataToSend(int elapsedTimeSeconds, int dataPerInterval, int secondsPerInterval) {
        int intervalIndex = elapsedTimeSeconds / secondsPerInterval; // 当前时间属于第几个5分钟时间间隔
        int timeInCurrentInterval = elapsedTimeSeconds % secondsPerInterval; // 当前时间在当前时间间隔内的秒数
        int dataToSend = (int) (dataPerInterval * ((double) timeInCurrentInterval / secondsPerInterval));
        // 最后一个时间间隔中，可能不足每个时间间隔应发送的数据量，所以做一次判断
        if (intervalIndex == (totalTimeSeconds / secondsPerInterval) - 1) {
            int remainingData = totalDataSize - (dataPerInterval * (totalTimeSeconds / secondsPerInterval - 1));
            dataToSend = Math.min(dataToSend, remainingData);
        }
        return dataToSend;
    }
    // 模拟发送数据的方法
    private static void send(int dataToSend) {
        // 这里写发送数据的实际代码
        System.out.println("发送数据: " + dataToSend);
    }
}
